Play framework 2.0 betaが出たようです12 – Controller,Session
Controller関連の追加情報
先日Playframework2.0のgithubのwikiを見たらけっこうな量が更新されてました。いよいよRC版の登場も近そうです。 wikiをみると興味深い追加情報がいろいろとあったので、かいつまんでご紹介します。 今回はController周りに関する機能の紹介です。
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.2
- Playframework : HEAD
- Java : 1.6.0_26
- Eclipse : 3.7
注意: この記事ではgithubから取得したHEAD版を使用して試しています。 正式リリース前の状況のため思わぬ不具合が生じるかもしれませんので、ご了承ください。
ソースのHEADを取得してセットアップ
まだgithubからソースを取得していない人は、play2.0のソースを取得してビルドしましょう。
$ git clone https://github.com/playframework/Play20.git $ cd Play20/framework $ ./build > complile > build-repository > publish-local
すでにソースを取得している人は、最新の状態に更新してビルドします。
$ git pull $ cd Play20/framework $ ./cleanEverything $ ./build > compile > build-repository > publish-local
これで準備ができました。
プロジェクト作成
Scalaベースのプロジェクトを作成し、sbtコンソールを起動します。
% play new cont % cd cont % play
eclipsifyを実行してeclipseプロジェクト化してインポートしてソースの修正をしましょう。
>[myConfig] $ eclipsify
Resultのcontent type
Play2.0のControllerの関数はplay.api.mvc.Requestを受け取ってplay.api.mvc.Resultを返すようにするのが基本です。 ResultオブジェクトとしてOkやNotFoundが用意されているのですが、これらは渡した値によって適切なcontent typeが選択されます。 また、自分でcontent typeを指定することも可能です。
//Scalaテンプレートに渡す Ok(views.html.index("Your new application is ready.")) //text/plainで返す Ok("text plain") //text/xmlで返す Ok(<message>Hello World!</message>)
もしXMLオブジェクトを渡してhtmlで表示したいなら、asメソッドにcontent typeを指定します。
Ok(<message>Hello World!</message>).as("text/html") //またはOk(<message>Hello World!</message>).as(HTML)
ヘッダーとクッキー
ヘッダーを変えたいときはwithHeaders、クッキーを使用したいときはwithCookiesメソッドを使用します。
Ok("Hello World!!!").withHeaders( CACHE_CONTROL -> "max-age=3600", ETAG -> "xx" ).withCookies( Cookie("theme", "blue") )
Session
Playでは複数のHTTPリクエストにまたがるデータを保持したい場合、SessionかFlashスコープにデータを保存することができます。 Sessionのデータは、ユーザーセッション中に使用可能で、Flashスコープのデータは次のリクエストのみ使用可能です。 また、Sessionにタイムアウトはなく、ユーザーがWebブラウザを閉じたときには消滅します。
Sessionにデータを格納するには、withSessionメソッドを使用します。
//取得 Ok("Welcome!").withSession( "キー" -> "値" ) //取り出し def auth = Action { implicit request => session.get("キー").map { value => Ok(value) }.getOrElse { Unauthorized("Oops!!") } }
しかし、上記コードはSession全体を書き換えてしまうので注意してください。 既存のSessionに追加するには++を、既存のSessionから削除するには-メソッドを使用します。
Ok("Hello World!").withSession( session ++ ("saidHello" -> "yes") ) Ok("Theme reset!").withSession( session - "theme" )
Flash
次のリクエストまでの間だけ有効なデータでいいのならば、Flashを使用します。
def index = Action { implicit request => Ok { flash.get("success").getOrElse("Welcome!") } } def save = Action { Redirect("/index").flashing( "success" -> "The item has been created" ) }
まとめ
これ以外にもController周りには興味深いドキュメントがいろいろとあるのでwikiを参照してみてください。
参考サイトなど
- Manipulating Results: https://github.com/playframework/Play20/wiki/ScalaResults
- Session and Flash scopes: https://github.com/playframework/Play20/wiki/ScalaSessionFlash